import axios from 'axios'
import io from 'socket.io-client'
const socket = io('ws://localhost:9093');

// 获取聊天列表
const MSG_LIST = 'MSG_LIST'
// 读取消息
const MSG_RECV = 'MSG_RECV'
// 表示已读
const MSG_READ = 'MSG_READ'

const initState = {
    chatmsg : [],
    users:{},
    unread:0
}

export function chat(state=initState, action){
    switch(action.type){
        case MSG_LIST:
            return {...state,users:action.payload.u,chatmsg:action.payload.m,unread:action.payload.m.filter(v=>!v.read&&v.to==action.payload.userid).length} 

        case MSG_RECV:
            const n = action.payload.to == action.userid ? 1: 0;
            return {...state,chatmsg:[...state.chatmsg,action.payload],unread:state.unread+n}
        case MSG_READ:
            const {from, num} = action.payload
            return {...state, chatmsg:state.chatmsg.map(v=>({...v,read:from==v.from? true :v.read})), unread:state.unread-num}
        default:
            return state
    }
}

function msgList(m,u,userid){
    return {type:MSG_LIST, payload:{m,u,userid}}
}

function msgRecv(data,id){
    return {id,type:MSG_RECV, payload:data}
}

export function recvMsg(){
    return (dispatch,getState) => {
        
        socket.on('recvmsg',(data)=> {
            const userid = getState().user._id
            dispatch(msgRecv(data,userid))
        })
    }
}

export function getMsgList(){
    return (dispatch, getState) => {
        axios.get('/user/getmsglist')
        .then(res => {
            if(res.status === 200 && res.data.code===0){
                const userid = getState().user._id

                dispatch(msgList(res.data.msg, res.data.users, userid))
            }
        })
    }
}

export function sendMsg({from, to, msg}){
    return dispatch =>{
        socket.emit('sendmsg',{from, to, msg})
    }
    
}

function msgRead({from, userid, num}){
    return {type:MSG_READ, payload:{from,userid,num}}
}

export function readMsg(from){
    return (dispatch,getState) => {
        
        axios.post('/user/readmsg',{from})
            .then(res => {
                const userid = getState().user._id
                if(res.status == 200 && res.data.code==0){
                    dispatch(msgRead({userid, from, num:res.data.num}))
                }
            })
    }
}